{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import math\n",
    "plt.style.use('ggplot')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### House Prediction"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Making the dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train = np.array([[1.0], [2.0]], dtype=np.float32)\n",
    "y_train = np.array([[300.0], [500.0]], dtype=np.float32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Fg97LQ72WRyN2Wejwo85Tge1b98eH3/8sd661atXw8vLC0OHDoVUKkVpaSmWLFkChUKBOXPmGDSROTs7G46OjnWGGyIiIrIuZpnwbAx7e3v4+vrqrbO1tYWzszN8fX2F4FNeXo7p06fj/v37uH//PgDAxcUFUqkUZ86cQVFREQIDA2FjY4Pk5GTEx8djyJAhjfGRiIiIyAIZFX5GjRpV79dIJBJs3rzZmLcDAGRlZeHq1asAgBkzZuhti46OhoeHB+RyOfbu3YvY2FjodDqoVCqMHz8effv2Nfp9iYiI6MliVPgZPnw4Tp8+jZycHHTo0AFeXl4AgBs3biA5ORktWrTAM8880+DiFi5cKPzcrl07bN269aH7h4aG6t3ckIiIiOivjAo/bm5uKC4uxsqVK4XgUy0nJwcffPABXF1da1yGTkRERNTYjLrD844dOzBgwIAawQcAfHx88MILL2DHjh0NLo6IiIjI1IwKP7dv337oJeYymQy3b982uigiIiIiczEq/Pj6+mLv3r24c+dOjW23b99GYmJijSu3iIiIiCyBUXN+JkyYgCVLlmDmzJl45plnhFtU5+Xl4fTp09DpdJg+fbpJCyUiIiIyBaPCz9NPP40lS5Zgy5YtOH36NCoqKgAANjY26NChAyIiIjjyQ0RERBbJ6Jsc+vr64t1334VWq0VxcTGA/95skIiIiMhSNTipSKVSKJVKuLi44O7du3weChEREVk0g0d+bt68iatXr6JTp05wcnIS1peWlmLdunU4fvw4Kisr4eTkhJEjR+KFF14wS8FEREREDWHwyM+uXbuwZcsWODo66q3/97//jSNHjsDd3R1du3aFXC7HN998g1OnTpm8WCIiIqKGMnjk58qVK+jYsSMkEomwTq1W4/jx4wgKCsLChQshk8lw7949zJs3D3v37kWXLl3MUjQRERGRsQwe+blz5w68vb311p09exYAMHDgQMhkMgCAo6MjevXqhezsbNNVSURERGQiBocfrVYrBJxqly9fBgC0bdtWb33Tpk1x//59E5RHREREZFoGhx+VSoWrV68Ky1qtFhcvXoS3tzeUSqXeviUlJXBxcTFZkURERESmYvCcn/DwcHz77bfw9vZG69atceTIERQVFWHgwIE19k1NTYWnp6dJCyUiIiIyBYPDz/PPP4/k5GR89913wrq2bdtiyJAhevup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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X_train, y_train, marker='o', c='r', label=\"Data Points\")\n",
    "plt.xlabel(\"Price (in 1000s of Dollars)\")\n",
    "plt.ylabel(\"Size (in 1000s of Square Feet)\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Regression Model\n",
    "\n",
    "The function implemented in neuron without any activation is the same as the linear regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "linear_layer = tf.keras.layers.Dense(units=1, activation='linear')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "linear_layer.get_weights()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are no weights as they are not instantiated. When the X_train is added, it will trigger the instantiation of the weights."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor([[1.1644005]], shape=(1, 1), dtype=float32)\n"
     ]
    }
   ],
   "source": [
    "a1 = linear_layer(X_train[0].reshape(1,1)) # reshaped because the input needs to be in 2D\n",
    "print(a1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Result will a tensor (a tensorflow array) with the shape of (1,1) or having one entry. The weights are randomly initialized to small numbers and the bias is defaulted to 0."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Weights: [[1.1644005]], Bias: [0.]\n"
     ]
    }
   ],
   "source": [
    "w, b = linear_layer.get_weights()\n",
    "print(f\"Weights: {w}, Bias: {b}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lets set the weights and bias"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "set_w = np.array([[200]])\n",
    "set_b = np.array([100])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[array([[200.]], dtype=float32), array([100.], dtype=float32)]\n"
     ]
    }
   ],
   "source": [
    "linear_layer.set_weights([set_w, set_b])\n",
    "print(linear_layer.get_weights())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lets compare the equation 1 to the layer output"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor([[300.]], shape=(1, 1), dtype=float32)\n",
      "[[300.]]\n"
     ]
    }
   ],
   "source": [
    "a1 = linear_layer(X_train[0].reshape(1,1))\n",
    "print(a1)\n",
    "alin = np.dot(set_w, X_train[0].reshape(1, 1)) + set_b\n",
    "print(alin)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Making Predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "prediction_tf = linear_layer(X_train)\n",
    "prediction_np = np.dot(X_train, set_w) + set_b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TensorFlow Prediction: [[300.]\n",
      " [500.]]\n",
      "Numpy Prediction: [[300.]\n",
      " [500.]]\n"
     ]
    }
   ],
   "source": [
    "print(f\"TensorFlow Prediction: {prediction_tf}\")\n",
    "print(f\"Numpy Prediction: {prediction_np}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Neuron with Sigmoid activation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The function implemented in neuron with activation is the same as the logistic regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train = np.array([0., 1, 2, 3, 4, 5], dtype=np.float32).reshape(-1,1)  # 2-D Matrix\n",
    "Y_train = np.array([0,  0, 0, 1, 1, 1], dtype=np.float32).reshape(-1,1)  # 2-D Matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3., 4., 5.], dtype=float32)"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pos = Y_train == 1\n",
    "neg = Y_train == 0\n",
    "X_train[pos]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig,ax = plt.subplots(1,1,figsize=(4,3))\n",
    "ax.scatter(X_train[pos], Y_train[pos], marker='x', s=80, c = 'red', label=\"y=1\")\n",
    "ax.scatter(X_train[neg], Y_train[neg], marker='o', s=100, c='b', label=\"y=0\", facecolors='none', lw=3)\n",
    "\n",
    "ax.set_ylim(-0.08,1.1)\n",
    "ax.set_ylabel('y', fontsize=12)\n",
    "ax.set_xlabel('x', fontsize=12)\n",
    "ax.set_title('one variable plot')\n",
    "ax.legend(fontsize=12)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Logistic Neuron"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can implement by adding a sigmoid activation. We will create a TensorFlow model that contains our logistic layer to demonstrate an alternate method of creating models. Tf is most often used to create multi-layer models. The Sequential model is a convenient means of constructing these models."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\shahe\\AppData\\Roaming\\Python\\Python312\\site-packages\\keras\\src\\layers\\core\\dense.py:87: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n",
      "  super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n"
     ]
    }
   ],
   "source": [
    "model = tf.keras.Sequential (\n",
    "    [\n",
    "        tf.keras.layers.Dense(1, input_dim=1, activation='sigmoid' ,name=\"L1\")\n",
    "    ]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[1mModel: \"sequential\"\u001b[0m\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\"> Layer (type)                    </span>┃<span style=\"font-weight: bold\"> Output Shape           </span>┃<span style=\"font-weight: bold\">       Param # </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
       "│ L1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>)              │             <span style=\"color: #00af00; text-decoration-color: #00af00\">2</span> │\n",
       "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
       "</pre>\n"
      ],
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1mLayer (type)                   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape          \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
       "│ L1 (\u001b[38;5;33mDense\u001b[0m)                      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m)              │             \u001b[38;5;34m2\u001b[0m │\n",
       "└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">2</span> (8.00 B)\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m2\u001b[0m (8.00 B)\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">2</span> (8.00 B)\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m2\u001b[0m (8.00 B)\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Weights: [[1.0799071]], Bias: [0.]\n"
     ]
    }
   ],
   "source": [
    "logistic_layer = model.get_layer('L1')\n",
    "w, b = logistic_layer.get_weights()\n",
    "print(f\"Weights: {w}, Bias: {b}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Setting the weights and bias to known values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[array([[2.]], dtype=float32), array([-4.5], dtype=float32)]\n"
     ]
    }
   ],
   "source": [
    "set_w = np.array([[2]])\n",
    "set_b = np.array([-4.5])\n",
    "# set_weights takes a list of numpy arrays\n",
    "logistic_layer.set_weights([set_w, set_b])\n",
    "print(logistic_layer.get_weights())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's compare equation (2) to the layer output."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 65ms/step\n",
      "[[0.01098694]]\n",
      "[[0.98901306]]\n"
     ]
    }
   ],
   "source": [
    "a1 = model.predict(X_train[0].reshape(1,1))\n",
    "print(a1)\n",
    "a_1 = math.e ** (np.dot(set_w,X_train[0].reshape(1,1)) + set_b)\n",
    "alog = 1/(1+a_1)\n",
    "print(alog)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
